<?php

/**
 * This is the model class for table "Partido".
 *
 * The followings are the available columns in table 'Partido':
 * @property integer $id
 * @property string $nombre
 * @property string $creado
 * @property string $hasta
 * @property integer $id_tipo_partido
 *
 * The followings are the available model relations:
 * @property CorreoElectronico[] $correoElectronicos
 * @property Direccion[] $direccions
 * @property Organizacion $organizacion
 * @property TipoPartido $idTipoPartido
 * @property Persona $persona
 * @property RolPartido[] $rolPartidos
 */
class Partido extends CActiveRecord
{

	public  static $TIPO_PERSONA='PERSONA';
	public static  $TIPO_ORGANIZACION_GRUPO='ORGANIZACION';

	/**
	 * Returns the static model of the specified AR class.
	 * @param string $className active record class name.
	 * @return Partido the static model class
	 */
	public static function model($className=__CLASS__)
	{
		return parent::model($className);
	}



	/*
	 * Busca la direccion actual del partido, si bien la base de datos soporta mas de una direccion
	* la logica del negocio solamente permite una direccion.
	*/
	public function obtenerDireccion(){
		$direcciones=$this->direcciones;
		if(count($direcciones)>0){
			return  $direcciones[0];
		}
		else{
			return  null;
		}
	}

	public function actualizarCorreosElectronicos($correos_electronicos){
		//inicializo el array con un dummy key para que cuando
		$idsCorreosGuardados=array();
		//En el hash de correos guardados deberia venir una clave de la forma
		//nuevo_{digito}|guardado_{digito}
		// donde {digito} si esta junto con "guardado" es el id del correo guardado y un correlativo para uno nuevo
		foreach($correos_electronicos as $key=>$correo_electronico){
			$correo_info=explode('_',$key);
			if(strtolower($correo_info[0])=='nuevo'){
				$objCorreoElectronico=new CorreoElectronico();
				$objCorreoElectronico->id_partido=$this->id;
				$objCorreoElectronico->correo_electronico=$correo_electronico;
				$objCorreoElectronico->save();
				$idsCorreosGuardados[]=$objCorreoElectronico->id;
			}
			else{
				$idsCorreosGuardados[]=$correo_info[1];
			}
		}
		//Si hay alguno en el array  eliminar todos menos los del array (significa que el usuario los elimino)
		if(count($idsCorreosGuardados)>0){
			$ids=implode(",",$idsCorreosGuardados);
			$sql="delete from correo_electronico where id_partido=:id_partido
			and id not in ($ids)";
		}
		else{//Si no hay ninguno guardado
			$sql="delete from correo_electronico where id_partido=:id_partido";
		}
		$connection=Yii::app()->db;
		$command=$connection->createCommand($sql);
		$id=$this->id;
		$command->bindParam(':id_partido',$id,PDO::PARAM_INT);
		$command->execute();
	}

	public function usuario(){
		$criteria=new CDbCriteria(array(
				"condition"=>'p.id=:id_partido',
				"join"=>"inner join rol_partido rp on rp.id=id_rol_partido
				inner join partido p on p.id=rp.id_partido
				inner join tipo_rol_partido trp on trp.id=rp.id_tipo_rol_partido and trp.descripcion='USUARIO'",
				"params"=>array(":id_partido"=>$this->id)
		));
		$usuario=Usuario::model()->find($criteria);
		return $usuario;
	}


	/*
	 * Retorna el telefono domicilio del partido. Si bien se permite mas de un telefono celular en la base de datos
	* la logica del negocio solo acepta telefono celular y de domicilio
	*/
	function obtenerTelefono($tipo){
		$criteria=new CDbCriteria(array(
				'condition'=>"id_partido=:id_partido and tipo_telefono=:tipo_telefono ",
				'params'=>array(':id_partido'=>$this->id,':tipo_telefono'=>$tipo),
		));
		return Telefono::model()->find($criteria);
	}

	/**
	 * @return string the associated database table name
	 */
	public function tableName()
	{
		return 'partido';
	}

	/**
	 * @return array validation rules for model attributes.
	 */
	public function rules()
	{
		// NOTE: you should only define rules for those attributes that
		// will receive user inputs.
		return array(
				array('nombre,  id_tipo_partido', 'required'),
				array('id_tipo_partido', 'numerical', 'integerOnly'=>true),
				array('nombre', 'length', 'max'=>45),
				array('hasta', 'safe'),
				// The following rule is used by search().
				// Please remove those attributes that should not be searched.
				array('id, nombre, hasta', 'safe', 'on'=>'search'),
		);
	}

	/**
	 * @return array relational rules.
	 */
	public function relations()
	{
		// NOTE: you may need to adjust the relation name and the related
		// class name for the relations automatically generated below.
		return array(
				'correos_electronicos' => array(self::HAS_MANY, 'CorreoElectronico', 'id_partido'),
				'direcciones' => array(self::HAS_MANY, 'Direccion', 'id_partido'),
				'organizacion' => array(self::HAS_ONE, 'Organizacion', 'id_partido'),
				'tipo_partido' => array(self::BELONGS_TO, 'TipoPartido', 'id_tipo_partido'),
				'persona' => array(self::HAS_ONE, 'Persona', 'id_partido'),
				'roles_partido' => array(self::HAS_MANY, 'RolPartido', 'id_partido'),
				'telefonos'=>array(self::HAS_MANY,'Telefono','id_partido')
		);
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
				'id' => 'ID',
				'nombre' => 'Nombre',
				'creado' => 'Creado',
				'hasta' => 'Hasta',
				'id_tipo_partido' => 'Id Tipo Partido',
		);
	}

	/**
	 * Retrieves a list of models based on the current search/filter conditions.
	 * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
	 */
	public function search()
	{
		// Warning: Please modify the following code to remove attributes that
		// should not be searched.

		$criteria=new CDbCriteria;

		$criteria->compare('id',$this->id);
		$criteria->compare('nombre',$this->nombre,true);
		$criteria->compare('creado',$this->creado,true);
		$criteria->compare('hasta',$this->hasta,true);
		$criteria->compare('id_tipo_partido',$this->id_tipo_partido);

		return new CActiveDataProvider($this, array(
				'criteria'=>$criteria,
		));
	}

	public function obtenerCorreosElectronicos($id_partido){
		if(!isset($id_partido))
			$id_partido=$this->id;
		$connection=Yii::app()->db;
		$sql="select ce.* from correo_electronico ce
				inner join partido p on p.id=ce.id_partido
				where p.id=:id_partido";
		$command=$connection->createCommand($sql);
		$command->bindParam(":id_partido",$id_partido,PDO::PARAM_INT);
		$result=$command->queryAll();
		return $result;
	}


	public function obtenerCorreosElectronicosJSON($id_partido){
		if(!isset($id_partido))
			$id_partido=$this->id;
		return json_encode($this->obtenerCorreosElectronicos($id_partido));
	}

	/**
	 * Guarda los datos comunes a un partido en funcion a datos de un formulario
	 */
	public function guardarDatosPartido($datos,$nombre){
			

		$id_partido=-1;
		//TipoPartido al que pertenece el catedratico
		$tipoPartido=TipoPartido::model()->find(array(
				'select'=>'id',
				'condition'=>'descripcion=:descripcion',
				'params'=>array(':descripcion'=>'PERSONA'),
		));
		$partido=new Partido();
		$partido->nombre=$nombre;		
		$partido->id_tipo_partido=$tipoPartido->id;	
		if($partido->save()){
			$id_partido=$partido->id;
			if(isset($datos['datos_contacto'])){
				$datos_contacto=$datos["datos_contacto"];
				//Almaceno datos de contacto
				//Direccion de domicilio
				if(isset($datos_contacto['direccion1'])){
					$direccion=new Direccion();
					$direccion->id_partido=$partido->id;
					$direccion->direccion1=$datos_contacto['direccion1'];
					$direccion->tipo_direccion='D';//Domicilio
					$direccion->save();
				}
				//Correo Electronico
				if(isset($datos['correos_electronicos'])){
					foreach ($datos["correos_electronicos"] as $direccionCorreo){
						$correoElectronico=new CorreoElectronico();
						$correoElectronico->id_partido=$partido->id;
						$correoElectronico->correo_electronico=$direccionCorreo;
						$correoElectronico->save();
					}
				}
				//Telefonos
				//Telefono celular
				if(isset($datos_contacto['telefono_celular'])){
					$telefonoCelular=new Telefono();
					$telefonoCelular->id_partido=$partido->id;
					$telefonoCelular->numero=$datos_contacto['telefono_celular'];
					$telefonoCelular->tipo_telefono='C';
					$telefonoCelular->save();
				}
				//Telefono domicilio
				if(isset($datos_contacto['telefono_domicilio']))	{
					$telefonoDomicilio=new Telefono();
					$telefonoDomicilio->id_partido=$partido->id;
					$telefonoDomicilio->numero=$datos_contacto['telefono_domicilio'];
					$telefonoDomicilio->tipo_telefono='D';
					$telefonoDomicilio->save();
				}
			}
		}
		else{
		//	var_dump($partido->getErrors());			
		}			
		return $id_partido;
	}

	
	public function beforeSave() {
		if ($this->isNewRecord){
			$this->creado = new CDbExpression('NOW()');
		}
		return parent::beforeSave();
	}


	public function actualizarDireccion($direccion1,$tipo){
		$direccion=Direccion::model()->find('id_partido=:id_partido and tipo_direccion=:tipo_direccion',
				array(':id_partido'=>$this->id,':tipo_direccion'=>$tipo));
		if(isset($direccion)){
			$direccion->direccion1=$direccion1;
			$direccion->save();
		}else{
			if(trim($direccion1)!=""){
				$direccion=new Direccion();
				$direccion->id_partido=$this->id;
				$direccion->tipo_direccion=$tipo;
				$direccion->direccion1=$direccion1;
				$direccion->save();
			}
		}
	}

	public function actualizarTelefono($numero,$tipo){
		$criteria=new CDbCriteria(array(
				"condition"=>"id_partido=:id_partido and tipo_telefono=:tipo_telefono",
				"params"=>array(":id_partido"=>$this->id,':tipo_telefono'=>$tipo))
		);
		$telefono=Telefono::model()->find($criteria);
		if(isset($telefono)){
			$telefono->numero=$numero;
			$telefono->save();
		}
		else{
			if(trim($numero)!=""){
				$telefono=new Telefono();
				$telefono->id_partido=$this->id;
				$telefono->numero=$numero;
				$telefono->tipo_telefono=$tipo;
				$telefono->save();
			}
		}
	}


}